<?php

include_once '../model/Etapa.php';
include_once '../daos/UsuarioDao.php';
include_once '../daos/EtapaDao.php';
include_once '../daos/AvanceDao.php';
include_once '../commons/Gmail.php';
include_once '../commons/Constants.php';

class UsuarioController {

    public function __construct() {
        
    }

    public function autenticate() {

        session_start();

        $user = strtoupper($_POST['username']);
        $pass = strtoupper($_POST['password']);
        $msj = "Error autenticando el usuario, por favor intente más tarde";
        $view = "../index.php";

        try {
            $dao = new UsuarioDao();

            $oUser = new Usuario();
            $login = new Login();
            $rol = new Rol();

            $login = $dao->getLogin($user, md5($pass));

            if (isset($login)) {

                $oUser = $dao->getUsuarioByLogin($login);

                if (isset($oUser)) {

                    $_SESSION['usuario'] = serialize($oUser);
                    $_SESSION['nbUsuario'] = $oUser->getNombre() . ' ' . $oUser->getApellido();

                    $msj = "Usuario autenticado satisfactoriamente";

                    $aDao = new AvanceDao();
                    unset($_SESSION['avancesDelMes']);

                    if ($oUser->getRol()->getDescripcion() == CLIENTE) {

                        $listAvances = $aDao->getAvance();

                        $eDao = new EtapaDao();
                        $etapa = $eDao->getEtapaById($dao->getEtapaByClient($oUser->getId()));
                        if (isset($etapa)) {
                            $i = 0;
                            $j = 0;

                            $list = array();
                            for ($i = 0; $i < count($listAvances); $i++) {
                                $avance = new Avance();
                                $avance = $listAvances[$i];
                                if ($etapa->getId() == $avance->getEtapa()->getId()) {
                                    $list[$j++] = $avance;
                                }
                                if (count($list) > 0) {
                                    $_SESSION['avancesDelMes'] = serialize($list);
                                }
                            }
                        }
                    } else {
                        $listAvances = $aDao->getAvanceByDate(date('Y-m-01'), date('Y-m-d'));
                        if (count($listAvances) > 0) {
                            $_SESSION['avancesDelMes'] = serialize($listAvances);
                        }
                    }

                    $view = "../views/home.php";
                }
            } else {
                $msj = "Usuario o clave incorrecta, por favor intente de nuevo";
            }
        } catch (Exception $e) {
            echo "ERROR";
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function listar() {

        session_start();

        $msj = "Error consultando los usuarios, por favor intente más tarde";
        $view = "../views/usuarios.php";

        try {
            $dao = new UsuarioDao();

            $listaUsuarios = array();
            $listaUsuarios = $dao->getUsuarios();

            if (isset($listaUsuarios)) {
                $msj = "";
                $_SESSION['listaUsuarios'] = serialize($listaUsuarios);
            }

            $roles = $dao->getRoles();
            $_SESSION['listaRoles'] = serialize($roles);
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function save() {

        session_start();

        $msj = "Error salvando el usuario";
        $estatus = AJAX_ERROR;
        $id = 0;

        try {
            $dao = new UsuarioDao();

            $contrato = $_POST['contrato'];

            $eDao = new EtapaDao();
            $etapa = $eDao->getEtapaByContrato($contrato);

            $rol = new Rol();

            if (!isset($_POST['idRol'])) {
                $rol = $dao->getRolByName(CLIENTE);
            } else {
                $rol = $dao->getRolById($_POST['idRol']);
            }


            if ($rol->getDescripcion() != CLIENTE || ($rol->getDescripcion() == CLIENTE && $etapa != null)) {

                $usuario = new Usuario();
                $usuario->setId($_POST['id']);
                $usuario->setNacionalidad(strtoupper($_POST['nac']));
                $usuario->setCedula($_POST['ci']);
                $usuario->setNombre(strtoupper($_POST['nombre']));
                $usuario->setApellido(strtoupper($_POST['apellido']));
                $usuario->setSexo(strtoupper($_POST['sexo']));
                $usuario->setTelefono($_POST['phone']);
                $usuario->setCorreo(($_POST['email'] != "" ? strtoupper($_POST['email']) : ""));

                $time = strtotime($_POST['fecha']);
                $usuario->setFechaNacimiento(date('Y-m-d', $time));

                $login = new Login();
                $login->setId($_POST['idLogin']);
                $login->setLogin($usuario->getNacionalidad() . $usuario->getCedula());
                if ($_POST['password'] == NOT_EDIT_PASS) {
                    $login->setPass($_POST['passOld']);
                } else {
                    $login->setPass(md5($_POST['password']));
                }
                $usuario->setLogin($login);
                $usuario->setRol($rol);

                if ($usuario->getId() == 0) {
                    if ($dao->getUsuarioByCI($usuario->getNacionalidad(), $usuario->getCedula()) != null) {
                        $msj = "El usuario ya existe, por favor verifique";
                        $usuario = null;
                    } else {
                        $usuario = $dao->saveUsuario($usuario);
                        if ($rol->getDescripcion() == CLIENTE) {
                            $dao->saveClient($usuario->getId(), $etapa->getId());
                        }
                    }
                } else {
                    $usuario = $dao->updateUsuario($usuario);
                    if ($rol->getDescripcion() == CLIENTE) {
                        $dao->updateClient($usuario->getId(), $etapa->getId());
                    }
                }

                if (isset($usuario) && $usuario->getId() > 0) {
                    $msj = "Usuario salvado satisfactoriamente";
                    $estatus = AJAX_SUCCESSFUL;
                    $id = $usuario->getId();
                }
            } else {
                $msj = "El número de contrato ingresado no existe. Por favor, verifique";
            }
        } catch (Exception $e) {
            
        }

        $responce = array('msj' => $msj, 'estatus' => $estatus, 'id' => $id);

        return json_encode($responce);
    }

    public function query() {

        session_start();

        $responce = array('msj' => "Error consultando el usuario", 'estatus' => AJAX_ERROR);

        try {
            $dao = new UsuarioDao();

            $oUsuario = new Usuario();
            $oUsuario = $dao->getUsuarioById($_POST['id']);


            if (isset($oUsuario)) {

                $time = strtotime($oUsuario->getFechaNacimiento());
                $contrato = "";

                if ($oUsuario->getRol()->getDescripcion() == CLIENTE) {
                    $eDao = new EtapaDao();
                    $etapa = $eDao->getEtapaById($dao->getEtapaByClient($oUsuario->getId()));
                    $contrato = $etapa->getContrato();
                }

                $responce = array('msj' => "",
                    'estatus' => AJAX_SUCCESSFUL,
                    'id' => $oUsuario->getId(),
                    'ci' => $oUsuario->getCedula(),
                    'nac' => $oUsuario->getNacionalidad(),
                    'nombre' => $oUsuario->getNombre(),
                    'apellido' => $oUsuario->getApellido(),
                    'correo' => $oUsuario->getCorreo(),
                    'telefono' => $oUsuario->getTelefono(),
                    'sexo' => $oUsuario->getSexo(),
                    'fecha' => date('d/m/Y', $time),
                    'rol' => $oUsuario->getRol()->getId(),
                    'contrato' => $contrato,
                    'idLogin' => $oUsuario->getLogin()->getId(),
                    'clave' => $oUsuario->getLogin()->getPass());
            }
        } catch (Exception $e) {
            
        }



        return json_encode($responce);
    }

    public function delete() {

        session_start();

        $msj = "Error eliminando el usuario";
        $estatus = 500;

        try {
            $dao = new UsuarioDao();

            $oUsuario = $dao->getUsuarioById($_POST['id']);

            if (isset($oUsuario)) {
                $result = $dao->deleteUsuario($oUsuario);

                if ($result) {
                    $msj = "Usuario eliminado satisfactoriamente";
                    $estatus = 200;
                }
            }
        } catch (Exception $e) {
            
        }

        $responce = array('msj' => $msj, 'estatus' => $estatus);

        return json_encode($responce);
    }

    public function perfil() {

        session_start();

        $msj = "";
        $view = "../views/perfil.php";

        try {
            $dao = new UsuarioDao();

            $roles = $dao->getRoles();
            $_SESSION['listaRoles'] = serialize($roles);
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = "";
        return $view;
    }

    public function logout() {

        $view = "../index.php";
        session_start();

        try {

            $_SESSION = array();
            session_unset();
            session_destroy();
        } catch (Exception $e) {
            
        }

        return $view;
    }

    public function recuperar() {

        session_start();

        $responce = array('msj' => "Error recuperando la clave", 'estatus' => AJAX_ERROR);

        try {
            $dao = new UsuarioDao();

            $oUser = new Usuario();
            $login = new Login();

            $login = $dao->getLoginByOnlyUser($_POST['nombre']);

            if (isset($login)) {

                $oUser = $dao->getUsuarioByLogin($login);

                if (isset($oUser)) {
                    if ($oUser->getCorreo() != "") {
                        $gmail = new Gmail();

                        $newContraseña = rand(99999, 9999999);

                        $asunto = "Recuperacion de Contraseña";
                        $msg = "<h1>Sistema de Gestión de Obras Tipo Tunel, Municipio Bolivariano Plaza.</h1>";
                        $msg .= "<br/><br/>";
                        $msg .= "<h2>Recuperación de contraseña para el usuario: " . $login->getLogin() . "</h2>";
                        $msg .= "<h2>Contraseña Temporal: " . $newContraseña . "</h2>";
                        $msg .= "<br/><br/>";
                        $msg .= "<h2>Mensaje enviado de manera automarita, por favor no responder.</h2>";

                        $address = array();
                        $address[0] = $oUser->getCorreo();
                        if ($gmail->send($address, $asunto, $msg, "")) {

                            $login->setPass(md5($newContraseña));
                            $dao->updateLogin($login);

                            $responce = array('msj' => "Se le envio su contraseña temporal a su correo ", 'estatus' => AJAX_SUCCESSFUL);
                        } 
                    }
                } else {
                    $responce = array('msj' => "El usuario no tiene correo asociado. Por favor, comuniquese con el administrador", 'estatus' => AJAX_ERROR);
                }
            } else {
                $responce = array('msj' => "El usuario indicado no existe", 'estatus' => AJAX_ERROR);
            }
        } catch (Exception $e) {
            
        }

        return json_encode($responce);
    }

}

?>